
var http = require("http");
var https = require("https");

var url = require("url");
var path = require("path");
var fsp = require("fs/promises");

// console.log(http);

const hostname = "localhost";
const port = "3000";

// http 的 createServer() 方法创建一个新的 HTTP 服务器并返回它。
// createServer() 可以接受一个回调函数, 每当服务器接收到来自客户端的请求时都会执行一次
// 回调函数中有两个参数(形参) request response
// request(对象) 接收客户端传递的信息
// response(对象) 配置服务端响应的相关信息

var site = path.join(__dirname, "../site");  // 配置站点路径

var server = http.createServer(async function (req, res) {

    if (req.url != "/favicon.ico") { // 非网页图片
        console.log("接收到来自客户端的请求");



        // console.log(req.url);  // 本次客户端,请求服务器的内容的地址 (路径部分 + 参数数据队列)

        var urlDetail = url.parse(req.url, true);
        // console.log(urlDetail);
        var { pathname, query } = urlDetail;  // pathname url中的路径部分  query:url中的参数数据解析
        console.log(pathname);

        // 对应url地址栏中路径部分 展示页面

        //(1) 默认从site文件夹中查找文件(site默认站点)    
        //(2) 不同类型的文件 输出不同的Content-Type格式
        //     分析: 不同类型的文件,后缀名不同 .css  .js .html .json .png .jpg .jpeg .gif



        var ext = path.extname(pathname); // 获取地址栏路径部分的后缀名
        console.log(ext);

        if (ext) {
            switch (ext) {
                case ".html":
                    res.writeHead(200, {
                        "Content-Type": "text/html;charset=utf-8",
                    })
                    break;
                case ".css":
                    res.writeHead(200, {
                        "Content-Type": "text/css;charset=utf-8",
                    })
                    break;
                case ".js":
                    res.writeHead(200, {
                        "Content-Type": "text/javascript;charset=utf-8",
                    })
                    break;
                case ".json":
                    res.writeHead(200, {
                        "Content-Type": "text/json;charset=utf-8",
                    })
                    break;
                case ".jpg":
                    res.writeHead(200, {
                        "Content-Type": "image/jpg",
                    })
                    break;
                case ".jpeg":
                    res.writeHead(200, {
                        "Content-Type": "image/jpeg",
                    })
                    break;
                case ".png":
                    res.writeHead(200, {
                        "Content-Type": "image/png",
                    })
                    break;
                case ".gif":
                    res.writeHead(200, {
                        "Content-Type": "image/gif",
                    })
                    break;
                case ".webp":
                    res.writeHead(200, {
                        "Content-Type": "image/webp",
                    })
                    break;
                case ".woff2":
                    res.writeHead(200, {
                        "Content-Type": "application/octet-stream",
                    })
                    break;
            }
        }

        var content = await fsp.readFile(path.join(site, pathname));
        console.log(1111, content);

        res.write(content);

        res.end();  // 请求处理结束,返回响应的结果 (并关闭响应)   => res.end() 不建议重复调用
    } else {
        res.end();
    }
});


// 服务器设置为监听指定的端口和主机名。 当服务器就绪时，回调函数被调用，在这种情况下通知我们服务器正在运行。
server.listen(port, hostname, function () {
    console.log("服务器启动成功=> http://localhost:3000");
})

